const http = require('http');
const url = require('url');
const querystring = require('querystring');

// 创建HTTP服务器
const server = http.createServer();

// 存储连接的客户端
const clients = new Map();

console.log('SSE服务器启动在 http://localhost:8080');

// 处理SSE连接请求
server.on('request', (req, res) => {
  // 设置CORS头
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
  
  // 处理OPTIONS请求
  if (req.method === 'OPTIONS') {
    res.statusCode = 200;
    res.end();
    return;
  }
  
  const parsedUrl = url.parse(req.url);
  const pathname = parsedUrl.pathname;
  
  // SSE连接端点
  if (pathname === '/sse') {
    // 设置SSE头
    res.writeHead(200, {
      'Content-Type': 'text/event-stream',
      'Cache-Control': 'no-cache',
      'Connection': 'keep-alive',
      'Access-Control-Allow-Origin': '*'
    });
    
    const clientId = Date.now().toString();
    console.log('新SSE客户端连接:', clientId);
    
    // 存储客户端响应对象
    clients.set(clientId, res);
    
    // 发送欢迎消息
    sendSSEMessage(res, {
      type: 'system',
      content: '欢迎使用SSE聊天服务器！'
    });
    
    // 处理连接关闭
    req.on('close', () => {
      console.log('SSE客户端断开连接:', clientId);
      clients.delete(clientId);
    });
    
    req.on('error', (error) => {
      console.error('SSE连接错误:', error);
      clients.delete(clientId);
    });
    
    // 保持连接活跃
    const keepAlive = setInterval(() => {
      if (clients.has(clientId)) {
        res.write(':keepalive\n\n');
      } else {
        clearInterval(keepAlive);
      }
    }, 30000);
    
    return;
  }
  
  // 处理消息发送请求
  if (pathname === '/send-message' && req.method === 'POST') {
    let body = '';
    
    req.on('data', chunk => {
      body += chunk.toString();
    });
    
    req.on('end', () => {
      try {
        const data = JSON.parse(body);
        console.log('收到消息:', data);
        
        if (data.type === 'message') {
          // 广播消息给所有SSE客户端
          broadcastSSEMessage({
            type: 'message_received',
            content: data.content,
            timestamp: Date.now()
          });
          
          // 模拟处理用户消息并返回多条回复
          simulateResponse(data.content);
        } else if (data.type === 'request_data') {
          // 处理数据请求
          sendTableData(data.content, data.sessionId);
        }
        
        res.statusCode = 200;
        res.end(JSON.stringify({ success: true }));
      } catch (error) {
        console.error('解析消息失败:', error);
        res.statusCode = 400;
        res.end(JSON.stringify({ error: '消息格式错误' }));
      }
    });
    
    return;
  }
  
  // 其他请求返回404
  res.statusCode = 404;
  res.end('Not Found');
});

// 发送SSE消息的辅助函数
function sendSSEMessage(res, data) {
  const message = `data: ${JSON.stringify(data)}\n\n`;
  res.write(message);
}

// 广播SSE消息给所有客户端
function broadcastSSEMessage(data) {
  clients.forEach((res, clientId) => {
    try {
      sendSSEMessage(res, data);
    } catch (error) {
      console.error('发送SSE消息失败:', error);
      clients.delete(clientId);
    }
  });
}

// 模拟服务器响应函数
function simulateResponse(userMessage) {
  // 模拟不同长度的回复内容，每条消息包含多个句子
  const messageTemplates = [
    [
      `我收到了您的消息: "${userMessage}"`,
      `这是一个很有趣的话题`,
      `让我为您详细分析一下`
    ],
    [
      `关于"${userMessage}"这个问题`,
      `我需要从多个角度来考虑`,
      `首先，我们可以从基础概念开始`,
      `然后深入探讨具体的实现方案`,
      `最后给出一些实用的建议`
    ],
    [
      `您提到的"${userMessage}"确实值得深入讨论`,
      `这涉及到很多技术细节`,
      `我会尽量用简单易懂的方式来解释`
    ],
    [
      `针对"${userMessage}"这个话题`,
      `我有一些不同的看法和建议`,
      `希望能够对您有所帮助`,
      `如果您还有其他问题，随时可以继续提问`
    ]
  ];
  
  // 随机决定返回1-3条消息
  const messageCount = Math.floor(Math.random() * 3) + 1;
  console.log(`将发送 ${messageCount} 条消息`);
  
  // 逐条发送消息
  for (let msgIndex = 0; msgIndex < messageCount; msgIndex++) {
    // 随机选择一个消息模板
    const selectedTemplate = messageTemplates[Math.floor(Math.random() * messageTemplates.length)];
    
    setTimeout(() => {
      const messageId = Date.now() + msgIndex;
      const isLastMessage = msgIndex === messageCount - 1;
      
      console.log(`开始发送第 ${msgIndex + 1} 条消息，包含 ${selectedTemplate.length} 个句子`);
      
      // 逐句发送消息内容
      selectedTemplate.forEach((sentence, sentenceIndex) => {
        setTimeout(() => {
          const isLastSentence = sentenceIndex === selectedTemplate.length - 1;
          
          // 发送句子内容，每句以\n结尾
          broadcastSSEMessage({
            type: 'response_chunk',
            content: sentence + '\n',
            messageId: messageId,
            sentenceIndex: sentenceIndex,
            isLastSentence: isLastSentence,
            isLastMessage: isLastMessage
          });
          
          console.log(`发送句子 ${sentenceIndex + 1}/${selectedTemplate.length}: ${sentence}`);
          
          // 如果是当前消息的最后一句，发送消息结束标记(\n\n)
          if (isLastSentence) {
            setTimeout(() => {
              broadcastSSEMessage({
                type: 'response_chunk',
                content: '\n',
                messageId: messageId,
                isMessageEnd: true,
                isLastMessage: isLastMessage
              });
              
              console.log(`消息 ${msgIndex + 1} 发送完成${isLastMessage ? ' (所有消息发送完成)' : ''}`);
              
              // 如果是最后一条消息，发送完成信号
              if (isLastMessage) {
                setTimeout(() => {
                  broadcastSSEMessage({
                    type: 'complete',
                    content: '所有回复已发送完成'
                  });
                  console.log('发送完成信号');
                }, 200);
              }
            }, 300); // 消息结束标记延迟300ms
          }
        }, sentenceIndex * 800); // 每句间隔800ms
      });
    }, msgIndex * (selectedTemplate.length * 800 + 1000)); // 每条消息之间有额外间隔
  }
}

// 存储会话数据的映射表
const sessionDataMap = new Map();

// 发送表格数据函数
function sendTableData(requestContent, sessionId) {
  console.log('收到数据请求，发送表格数据...会话ID:', sessionId);
  
  // 检查是否已有该会话的数据
  let mockTableData;
  
  if (sessionDataMap.has(sessionId)) {
    // 使用已存储的数据
    mockTableData = sessionDataMap.get(sessionId);
    console.log('使用已存储的会话数据');
  } else {
    // 为新会话生成数据
    mockTableData = [
      {
        id: '1',
        name: `会话${sessionId.slice(-4)}的分析结果1`,
        value: Math.floor(Math.random() * 1000),
        category: '类别A',
        status: '正常',
        date: new Date().toLocaleDateString()
      },
      {
        id: '2',
        name: `会话${sessionId.slice(-4)}的分析结果2`,
        value: Math.floor(Math.random() * 1000),
        category: '类别B',
        status: '异常',
        date: new Date().toLocaleDateString()
      },
      {
        id: '3',
        name: `会话${sessionId.slice(-4)}的分析结果3`,
        value: Math.floor(Math.random() * 1000),
        category: '类别A',
        status: '正常',
        date: new Date().toLocaleDateString()
      },
      {
        id: '4',
        name: `会话${sessionId.slice(-4)}的分析结果4`,
        value: Math.floor(Math.random() * 1000),
        category: '类别C',
        status: '警告',
        date: new Date().toLocaleDateString()
      }
    ];
    
    // 存储会话数据
    sessionDataMap.set(sessionId, mockTableData);
    console.log('已生成并存储新的会话数据');
  }
  
  broadcastSSEMessage({
    type: 'data',
    content: mockTableData,
    sessionId: sessionId
  });
  
  console.log('已发送表格数据:', mockTableData.length, '条');
}

// 处理服务器错误
server.on('error', (error) => {
  console.error('服务器错误:', error);
});

// 启动服务器
server.listen(8080, () => {
  console.log('服务器正在监听端口 8080');
});

// 优雅关闭
process.on('SIGINT', () => {
  console.log('\n正在关闭服务器...');
  
  // 关闭所有SSE客户端连接
  clients.forEach((res, clientId) => {
    try {
      res.end();
    } catch (error) {
      console.error('关闭SSE连接失败:', error);
    }
  });
  
  // 清空客户端Map
  clients.clear();
  
  // 关闭服务器
  server.close(() => {
    console.log('服务器已关闭');
    process.exit(0);
  });
});

process.on('SIGTERM', () => {
  console.log('\n收到SIGTERM信号，正在关闭服务器...');
  
  // 关闭所有SSE客户端连接
  clients.forEach((res, clientId) => {
    try {
      res.end();
    } catch (error) {
      console.error('关闭SSE连接失败:', error);
    }
  });
  
  // 清空客户端Map
  clients.clear();
  
  // 关闭服务器
  server.close(() => {
    console.log('服务器已关闭');
    process.exit(0);
  });
});